package com.example.wx.other;

import com.vivo.it.vwkc.pop.web.common.exception.BaseErrorInterface;
import org.springframework.context.MessageSource;
import org.springframework.context.i18n.LocaleContextHolder;
import org.springframework.stereotype.Component;

import javax.annotation.PostConstruct;
import javax.annotation.Resource;
import java.util.EnumSet;

/**
 * @author 姜冲/72152416
 * @version 1.0
 * @date 2021/9/27 10:05
 * @description 请求错误信息
 */
public enum RequestResultEnum implements BaseErrorInterface {

    /**
     * SUCCESS
     */
    SUCCESS("200","SUCCESS"),
    /**
     * BODY_NOT_MATCH
     */
    BODY_NOT_MATCH("400","BODY_NOT_MATCH"),
    /**
     * SIGNATURE_NOT_MATCH
     */
    SIGNATURE_NOT_MATCH("401","SIGNATURE_NOT_MATCH"),
    /**
     * NOT_FOUND
     */
    NOT_FOUND("404", "NOT_FOUND"),
    /**
     * INTERNAL_SERVER_ERROR
     */
    INTERNAL_SERVER_ERROR("500", "INTERNAL_SERVER_ERROR"),
    /**
     * SERVER_BUSY
     */
    SERVER_BUSY("503","SERVER_BUSY"),

    /** ==========【通用业务错误】========== */
    /**
     * 文件不能为空
     */
    FILE_IS_EMPTY("101", "文件不能为空"),
    /**
     * 模板错误
     */
    FILE_FORMAT_ERROR("102", "模板错误"),
    /**
     * 文件流错误
     */
    FILE_STREAM_ERROR("103", "文件流错误"),
    /**
     * 文件内容有误
     */
    FILE_CONTENT_ERROR("104", "文件内容有误"),
    /**
     * 字段值有空
     */
    FILE_CELL_HAS_EMPTY("105", "字段值有空"),
    /**
     * 超过最大行数
     */
    FILE_SIZE_LIMIT_EXCEEDED("106", "超过最大行数"),
    /**
     * 表头不能为空
     */
    FILE_HEADER_IS_EMPTY("107", "表头不能为空"),
    /**
     * 通用错误
     */
    FILE_COMMON_ERROR("30000", "通用错误");

    /**
     * 错误码
     */
    private final String resultCode;

    /**
     * 错误描述
     */
    private final String resultMsg;

    RequestResultEnum(String resultCode, String resultMsg) {
        this.resultCode = resultCode;
        this.resultMsg = resultMsg;
    }

    private MessageSource messageSource;

    public RequestResultEnum setMessageSource(MessageSource messageSource) {
        this.messageSource = messageSource;
        return this;
    }

    /**
     * 通过静态内部类的方式注入bean，并赋值到枚举中
     */
    @Component
    public static class ReportTypeServiceInjector {

        @Resource
        private MessageSource messageSource;

        @PostConstruct
        public void postConstruct() {
            for (RequestResultEnum rt : EnumSet.allOf(RequestResultEnum.class)) {
                rt.setMessageSource(messageSource);
            }
        }
    }

    @Override
    public String getResultCode() {
        return resultCode;
    }

    @Override
    public String getResultMsg() {
        return messageSource.getMessage(resultMsg,null,resultMsg, LocaleContextHolder.getLocale());
    }
}
